In [ ]:
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2

显示注释¶

In [ ]:
def show_anns(anns):
    if len(anns) == 0:
        return
    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
    ax = plt.gca()
    ax.set_autoscale_on(False)

    img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))
    img[:,:,3] = 0
    for ann in sorted_anns:
        m = ann['segmentation']
        color_mask = np.concatenate([np.random.random(3), [0.35]])
        img[m] = color_mask
    ax.imshow(img)

导入测试图片¶

In [ ]:
image = cv2.imread('demo.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
In [ ]:
plt.figure(figsize = (20, 20))
plt.imshow(image)
plt.axis('off')
plt.show()

使用SAM模型¶

In [ ]:
import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor

sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"

device = "cuda"

sam = sam_model_registry[model_type](checkpoint = sam_checkpoint)
sam.to(device = device)

mask_generator = SamAutomaticMaskGenerator(sam)
In [ ]:
masks = mask_generator.generate(image)
In [ ]:
masks
Out[ ]:
[{'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 46478,
  'bbox': [0, 369, 682, 141],
  'predicted_iou': 1.0173600912094116,
  'point_coords': [[458.890625, 504.0]],
  'stability_score': 0.9792433381080627,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[ True,  True,  True, ..., False, False, False],
         [ True,  True,  True, ..., False, False, False],
         [ True,  True,  True, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 44323,
  'bbox': [0, 0, 624, 111],
  'predicted_iou': 1.0075346231460571,
  'point_coords': [[416.203125, 8.0]],
  'stability_score': 0.9760069251060486,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 740,
  'bbox': [219, 175, 28, 32],
  'predicted_iou': 1.006933331489563,
  'point_coords': [[224.109375, 200.0]],
  'stability_score': 0.9825970530509949,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 745,
  'bbox': [219, 175, 28, 47],
  'predicted_iou': 1.0051826238632202,
  'point_coords': [[245.453125, 200.0]],
  'stability_score': 0.9839572310447693,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[ True,  True,  True, ..., False, False, False],
         [ True,  True,  True, ..., False, False, False],
         [ True,  True,  True, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 45222,
  'bbox': [0, 0, 627, 158],
  'predicted_iou': 1.0004078149795532,
  'point_coords': [[53.359375, 72.0]],
  'stability_score': 0.9693746566772461,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1514,
  'bbox': [103, 301, 48, 34],
  'predicted_iou': 0.9993545413017273,
  'point_coords': [[117.390625, 328.0]],
  'stability_score': 0.9914361238479614,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 37998,
  'bbox': [535, 155, 141, 298],
  'predicted_iou': 0.9990236759185791,
  'point_coords': [[650.984375, 328.0]],
  'stability_score': 0.9839674234390259,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [ True,  True,  True, ..., False, False, False],
         [ True,  True,  True, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 33124,
  'bbox': [0, 366, 404, 144],
  'predicted_iou': 0.9977861642837524,
  'point_coords': [[202.765625, 424.0]],
  'stability_score': 0.971835196018219,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 12240,
  'bbox': [535, 337, 136, 114],
  'predicted_iou': 0.9976884126663208,
  'point_coords': [[586.953125, 344.0]],
  'stability_score': 0.9642914533615112,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 25001,
  'bbox': [537, 155, 138, 196],
  'predicted_iou': 0.9962787628173828,
  'point_coords': [[586.953125, 312.0]],
  'stability_score': 0.9829158186912537,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 32479,
  'bbox': [227, 287, 299, 222],
  'predicted_iou': 0.995901346206665,
  'point_coords': [[416.203125, 392.0]],
  'stability_score': 0.9732576608657837,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ...,  True,  True,  True],
         [False, False, False, ...,  True,  True,  True],
         [False, False, False, ..., False, False, False]]),
  'area': 13530,
  'bbox': [436, 411, 246, 99],
  'predicted_iou': 0.9944190979003906,
  'point_coords': [[458.890625, 504.0]],
  'stability_score': 0.987000584602356,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 14458,
  'bbox': [596, 156, 79, 195],
  'predicted_iou': 0.9919171929359436,
  'point_coords': [[608.296875, 328.0]],
  'stability_score': 0.9755529761314392,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1435,
  'bbox': [75, 211, 51, 50],
  'predicted_iou': 0.9911049604415894,
  'point_coords': [[96.046875, 248.0]],
  'stability_score': 0.9820689558982849,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 5776,
  'bbox': [86, 291, 76, 84],
  'predicted_iou': 0.988969087600708,
  'point_coords': [[160.078125, 328.0]],
  'stability_score': 0.9823054671287537,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1755,
  'bbox': [88, 344, 74, 31],
  'predicted_iou': 0.9881008267402649,
  'point_coords': [[160.078125, 360.0]],
  'stability_score': 0.9869466423988342,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 38267,
  'bbox': [534, 22, 142, 431],
  'predicted_iou': 0.9872207641601562,
  'point_coords': [[672.328125, 312.0]],
  'stability_score': 0.9649516344070435,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 26361,
  'bbox': [278, 319, 241, 190],
  'predicted_iou': 0.987101674079895,
  'point_coords': [[330.828125, 328.0]],
  'stability_score': 0.9625315070152283,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 6796,
  'bbox': [46, 194, 134, 84],
  'predicted_iou': 0.9869379997253418,
  'point_coords': [[74.703125, 232.0]],
  'stability_score': 0.9541390538215637,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1490,
  'bbox': [465, 189, 43, 58],
  'predicted_iou': 0.9860725402832031,
  'point_coords': [[501.578125, 216.0]],
  'stability_score': 0.9813457727432251,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 684,
  'bbox': [355, 281, 49, 17],
  'predicted_iou': 0.9804818630218506,
  'point_coords': [[394.859375, 296.0]],
  'stability_score': 0.9840579628944397,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1848,
  'bbox': [278, 356, 91, 31],
  'predicted_iou': 0.9785518646240234,
  'point_coords': [[330.828125, 376.0]],
  'stability_score': 0.9828326106071472,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 8998,
  'bbox': [4, 78, 63, 152],
  'predicted_iou': 0.9780564904212952,
  'point_coords': [[32.015625, 88.0]],
  'stability_score': 0.9545652270317078,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 285,
  'bbox': [531, 0, 28, 12],
  'predicted_iou': 0.9776028990745544,
  'point_coords': [[544.265625, 8.0]],
  'stability_score': 0.9656357169151306,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1521,
  'bbox': [423, 168, 26, 59],
  'predicted_iou': 0.9774786233901978,
  'point_coords': [[437.546875, 184.0]],
  'stability_score': 0.9888961315155029,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 6239,
  'bbox': [225, 286, 302, 47],
  'predicted_iou': 0.9764799475669861,
  'point_coords': [[458.890625, 328.0]],
  'stability_score': 0.9555277228355408,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 9305,
  'bbox': [332, 165, 201, 232],
  'predicted_iou': 0.9756120443344116,
  'point_coords': [[458.890625, 232.0]],
  'stability_score': 0.9501045942306519,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 3222,
  'bbox': [28, 306, 53, 66],
  'predicted_iou': 0.9755492806434631,
  'point_coords': [[32.015625, 360.0]],
  'stability_score': 0.9778937697410583,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 3449,
  'bbox': [507, 83, 28, 143],
  'predicted_iou': 0.9754408597946167,
  'point_coords': [[522.921875, 216.0]],
  'stability_score': 0.951116144657135,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 8925,
  'bbox': [332, 166, 201, 120],
  'predicted_iou': 0.9742143750190735,
  'point_coords': [[458.890625, 232.0]],
  'stability_score': 0.954967737197876,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 944,
  'bbox': [471, 194, 36, 44],
  'predicted_iou': 0.9739421010017395,
  'point_coords': [[501.578125, 216.0]],
  'stability_score': 0.971727728843689,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 183,
  'bbox': [386, 45, 21, 9],
  'predicted_iou': 0.9732680916786194,
  'point_coords': [[394.859375, 56.0]],
  'stability_score': 0.9838709831237793,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1408,
  'bbox': [581, 195, 13, 112],
  'predicted_iou': 0.9729430079460144,
  'point_coords': [[586.953125, 280.0]],
  'stability_score': 0.9728789925575256,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 554,
  'bbox': [24, 101, 26, 22],
  'predicted_iou': 0.9727633595466614,
  'point_coords': [[32.015625, 104.0]],
  'stability_score': 0.9909909963607788,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 781,
  'bbox': [308, 110, 23, 46],
  'predicted_iou': 0.9726859331130981,
  'point_coords': [[309.484375, 136.0]],
  'stability_score': 0.9684343338012695,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1088,
  'bbox': [25, 286, 54, 22],
  'predicted_iou': 0.9725911617279053,
  'point_coords': [[32.015625, 296.0]],
  'stability_score': 0.9781619906425476,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 11023,
  'bbox': [236, 297, 146, 213],
  'predicted_iou': 0.971786618232727,
  'point_coords': [[309.484375, 456.0]],
  'stability_score': 0.9500795006752014,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 5245,
  'bbox': [143, 98, 53, 131],
  'predicted_iou': 0.9717726707458496,
  'point_coords': [[160.078125, 104.0]],
  'stability_score': 0.9684210419654846,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 3959,
  'bbox': [87, 291, 75, 59],
  'predicted_iou': 0.97174471616745,
  'point_coords': [[160.078125, 328.0]],
  'stability_score': 0.9837051630020142,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 7276,
  'bbox': [6, 282, 79, 104],
  'predicted_iou': 0.9716558456420898,
  'point_coords': [[10.671875, 328.0]],
  'stability_score': 0.9653825163841248,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 7041,
  'bbox': [197, 288, 74, 187],
  'predicted_iou': 0.9698989391326904,
  'point_coords': [[245.453125, 328.0]],
  'stability_score': 0.9511350989341736,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 5842,
  'bbox': [327, 274, 206, 133],
  'predicted_iou': 0.968863844871521,
  'point_coords': [[416.203125, 280.0]],
  'stability_score': 0.9597315192222595,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 3482,
  'bbox': [458, 72, 43, 84],
  'predicted_iou': 0.9685843586921692,
  'point_coords': [[458.890625, 136.0]],
  'stability_score': 0.9680880904197693,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1200,
  'bbox': [546, 247, 34, 35],
  'predicted_iou': 0.9685654044151306,
  'point_coords': [[565.609375, 248.0]],
  'stability_score': 0.9666123986244202,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 3396,
  'bbox': [144, 143, 51, 86],
  'predicted_iou': 0.9669758081436157,
  'point_coords': [[160.078125, 152.0]],
  'stability_score': 0.9592720866203308,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 8636,
  'bbox': [65, 87, 96, 107],
  'predicted_iou': 0.9664485454559326,
  'point_coords': [[96.046875, 184.0]],
  'stability_score': 0.9686251878738403,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 829,
  'bbox': [82, 216, 37, 37],
  'predicted_iou': 0.9656181931495667,
  'point_coords': [[96.046875, 248.0]],
  'stability_score': 0.9654350280761719,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 5777,
  'bbox': [613, 29, 55, 110],
  'predicted_iou': 0.9653907418251038,
  'point_coords': [[629.640625, 40.0]],
  'stability_score': 0.9735485911369324,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 7306,
  'bbox': [74, 270, 90, 105],
  'predicted_iou': 0.9650701284408569,
  'point_coords': [[138.734375, 344.0]],
  'stability_score': 0.9737625122070312,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 8807,
  'bbox': [433, 337, 73, 145],
  'predicted_iou': 0.964968740940094,
  'point_coords': [[437.546875, 424.0]],
  'stability_score': 0.9534704089164734,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 839,
  'bbox': [219, 175, 28, 82],
  'predicted_iou': 0.9649591445922852,
  'point_coords': [[224.109375, 184.0]],
  'stability_score': 0.9822485446929932,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 208,
  'bbox': [433, 247, 15, 13],
  'predicted_iou': 0.9635624885559082,
  'point_coords': [[437.546875, 248.0]],
  'stability_score': 0.9617224931716919,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 818,
  'bbox': [505, 51, 27, 34],
  'predicted_iou': 0.9625276923179626,
  'point_coords': [[522.921875, 72.0]],
  'stability_score': 0.981840193271637,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 7798,
  'bbox': [6, 280, 152, 106],
  'predicted_iou': 0.9620460271835327,
  'point_coords': [[10.671875, 344.0]],
  'stability_score': 0.9739800691604614,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 4923,
  'bbox': [542, 43, 51, 105],
  'predicted_iou': 0.9607592225074768,
  'point_coords': [[544.265625, 136.0]],
  'stability_score': 0.9578863978385925,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 5146,
  'bbox': [312, 160, 62, 125],
  'predicted_iou': 0.9606002569198608,
  'point_coords': [[330.828125, 248.0]],
  'stability_score': 0.9722115993499756,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 49,
  'bbox': [263, 265, 7, 6],
  'predicted_iou': 0.9593550562858582,
  'point_coords': [[266.796875, 264.0]],
  'stability_score': 0.9800000190734863,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 137,
  'bbox': [145, 72, 20, 7],
  'predicted_iou': 0.9589571952819824,
  'point_coords': [[160.078125, 72.0]],
  'stability_score': 0.9855072498321533,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 8838,
  'bbox': [603, 20, 75, 127],
  'predicted_iou': 0.9589266180992126,
  'point_coords': [[608.296875, 56.0]],
  'stability_score': 0.952454686164856,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 186,
  'bbox': [225, 246, 14, 12],
  'predicted_iou': 0.9582304358482361,
  'point_coords': [[224.109375, 248.0]],
  'stability_score': 0.9840425252914429,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 584,
  'bbox': [241, 127, 19, 40],
  'predicted_iou': 0.9580662250518799,
  'point_coords': [[245.453125, 152.0]],
  'stability_score': 0.9781144857406616,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 992,
  'bbox': [215, 338, 54, 26],
  'predicted_iou': 0.9564071893692017,
  'point_coords': [[245.453125, 360.0]],
  'stability_score': 0.9771144390106201,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 4657,
  'bbox': [151, 279, 58, 166],
  'predicted_iou': 0.9556385278701782,
  'point_coords': [[160.078125, 408.0]],
  'stability_score': 0.9547927975654602,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 52,
  'bbox': [324, 263, 7, 6],
  'predicted_iou': 0.954174816608429,
  'point_coords': [[330.828125, 264.0]],
  'stability_score': 1.0,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 87,
  'bbox': [409, 247, 6, 12],
  'predicted_iou': 0.9537890553474426,
  'point_coords': [[416.203125, 248.0]],
  'stability_score': 0.9886363744735718,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 91,
  'bbox': [640, 169, 15, 6],
  'predicted_iou': 0.9534012675285339,
  'point_coords': [[650.984375, 168.0]],
  'stability_score': 0.989130437374115,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 357,
  'bbox': [463, 252, 24, 31],
  'predicted_iou': 0.9522260427474976,
  'point_coords': [[480.234375, 264.0]],
  'stability_score': 0.9807162284851074,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1711,
  'bbox': [400, 0, 25, 162],
  'predicted_iou': 0.9521768093109131,
  'point_coords': [[416.203125, 152.0]],
  'stability_score': 0.9583333134651184,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 104,
  'bbox': [408, 246, 8, 13],
  'predicted_iou': 0.9516780376434326,
  'point_coords': [[416.203125, 248.0]],
  'stability_score': 0.9809523820877075,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 106,
  'bbox': [392, 245, 7, 13],
  'predicted_iou': 0.9501556158065796,
  'point_coords': [[394.859375, 248.0]],
  'stability_score': 0.9906542301177979,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 626,
  'bbox': [167, 325, 41, 21],
  'predicted_iou': 0.9493546485900879,
  'point_coords': [[202.765625, 328.0]],
  'stability_score': 0.9841772317886353,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 520,
  'bbox': [286, 286, 45, 13],
  'predicted_iou': 0.9490737915039062,
  'point_coords': [[309.484375, 296.0]],
  'stability_score': 0.9885277152061462,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1373,
  'bbox': [598, 194, 12, 115],
  'predicted_iou': 0.9490213394165039,
  'point_coords': [[608.296875, 232.0]],
  'stability_score': 0.9784017205238342,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 455,
  'bbox': [166, 117, 23, 20],
  'predicted_iou': 0.9489136338233948,
  'point_coords': [[181.421875, 120.0]],
  'stability_score': 0.9718614816665649,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1250,
  'bbox': [314, 356, 54, 30],
  'predicted_iou': 0.9487617611885071,
  'point_coords': [[330.828125, 360.0]],
  'stability_score': 0.9694357514381409,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1065,
  'bbox': [400, 87, 25, 56],
  'predicted_iou': 0.94685298204422,
  'point_coords': [[416.203125, 120.0]],
  'stability_score': 0.9768732786178589,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 414,
  'bbox': [33, 370, 46, 14],
  'predicted_iou': 0.945624053478241,
  'point_coords': [[74.703125, 376.0]],
  'stability_score': 0.9831730723381042,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 6833,
  'bbox': [254, 162, 59, 124],
  'predicted_iou': 0.9453414678573608,
  'point_coords': [[309.484375, 216.0]],
  'stability_score': 0.9531896710395813,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 9407,
  'bbox': [416, 52, 114, 123],
  'predicted_iou': 0.9429106712341309,
  'point_coords': [[437.546875, 72.0]],
  'stability_score': 0.961414098739624,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 4614,
  'bbox': [25, 285, 57, 88],
  'predicted_iou': 0.9411770105361938,
  'point_coords': [[32.015625, 328.0]],
  'stability_score': 0.9529039263725281,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 2353,
  'bbox': [421, 80, 36, 81],
  'predicted_iou': 0.9402809739112854,
  'point_coords': [[437.546875, 152.0]],
  'stability_score': 0.9563772082328796,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1913,
  'bbox': [546, 227, 35, 55],
  'predicted_iou': 0.9389686584472656,
  'point_coords': [[565.609375, 280.0]],
  'stability_score': 0.9762396812438965,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 568,
  'bbox': [405, 286, 39, 17],
  'predicted_iou': 0.9383705854415894,
  'point_coords': [[437.546875, 296.0]],
  'stability_score': 0.9703832864761353,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 11540,
  'bbox': [255, 126, 118, 160],
  'predicted_iou': 0.9377568960189819,
  'point_coords': [[309.484375, 248.0]],
  'stability_score': 0.9515992403030396,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1600,
  'bbox': [308, 12, 23, 161],
  'predicted_iou': 0.9371656179428101,
  'point_coords': [[330.828125, 136.0]],
  'stability_score': 0.9601959586143494,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1217,
  'bbox': [241, 41, 19, 139],
  'predicted_iou': 0.9300827980041504,
  'point_coords': [[245.453125, 152.0]],
  'stability_score': 0.9716598987579346,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 206,
  'bbox': [243, 165, 14, 16],
  'predicted_iou': 0.9287462830543518,
  'point_coords': [[245.453125, 168.0]],
  'stability_score': 0.9666666388511658,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 7322,
  'bbox': [342, 109, 79, 118],
  'predicted_iou': 0.9275321960449219,
  'point_coords': [[394.859375, 200.0]],
  'stability_score': 0.9630324244499207,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 620,
  'bbox': [167, 272, 42, 18],
  'predicted_iou': 0.9254405498504639,
  'point_coords': [[202.765625, 280.0]],
  'stability_score': 0.9618442058563232,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 261,
  'bbox': [212, 498, 27, 13],
  'predicted_iou': 0.9207274317741394,
  'point_coords': [[224.109375, 504.0]],
  'stability_score': 0.9771863222122192,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 788,
  'bbox': [276, 261, 55, 39],
  'predicted_iou': 0.9206655025482178,
  'point_coords': [[309.484375, 296.0]],
  'stability_score': 0.9580246806144714,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 605,
  'bbox': [444, 290, 43, 15],
  'predicted_iou': 0.9198945164680481,
  'point_coords': [[458.890625, 296.0]],
  'stability_score': 0.9690553545951843,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 153,
  'bbox': [519, 396, 12, 14],
  'predicted_iou': 0.9194123148918152,
  'point_coords': [[522.921875, 408.0]],
  'stability_score': 0.9548386931419373,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 10002,
  'bbox': [536, 163, 60, 177],
  'predicted_iou': 0.9177022576332092,
  'point_coords': [[586.953125, 312.0]],
  'stability_score': 0.9552841782569885,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1440,
  'bbox': [73, 270, 90, 22],
  'predicted_iou': 0.9166570901870728,
  'point_coords': [[96.046875, 280.0]],
  'stability_score': 0.9538983106613159,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 318,
  'bbox': [331, 278, 23, 15],
  'predicted_iou': 0.9153357148170471,
  'point_coords': [[352.171875, 280.0]],
  'stability_score': 0.9599999785423279,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 2463,
  'bbox': [65, 164, 96, 30],
  'predicted_iou': 0.9122650027275085,
  'point_coords': [[117.390625, 168.0]],
  'stability_score': 0.952362060546875,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 566,
  'bbox': [281, 282, 51, 18],
  'predicted_iou': 0.9109628200531006,
  'point_coords': [[288.140625, 296.0]],
  'stability_score': 0.9567474126815796,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 45,
  'bbox': [353, 102, 5, 7],
  'predicted_iou': 0.9096499085426331,
  'point_coords': [[352.171875, 104.0]],
  'stability_score': 0.97826087474823,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 7706,
  'bbox': [417, 53, 88, 108],
  'predicted_iou': 0.9064235091209412,
  'point_coords': [[458.890625, 72.0]],
  'stability_score': 0.9607843160629272,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 152,
  'bbox': [14, 272, 19, 8],
  'predicted_iou': 0.903232991695404,
  'point_coords': [[32.015625, 280.0]],
  'stability_score': 0.9743589758872986,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 1619,
  'bbox': [155, 99, 41, 44],
  'predicted_iou': 0.9008966684341431,
  'point_coords': [[160.078125, 104.0]],
  'stability_score': 0.9522081017494202,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 8999,
  'bbox': [181, 99, 73, 188],
  'predicted_iou': 0.8992994427680969,
  'point_coords': [[245.453125, 232.0]],
  'stability_score': 0.9531947374343872,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 70,
  'bbox': [303, 183, 6, 10],
  'predicted_iou': 0.8900394439697266,
  'point_coords': [[309.484375, 184.0]],
  'stability_score': 0.9571428298950195,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 136,
  'bbox': [393, 264, 11, 12],
  'predicted_iou': 0.8862489461898804,
  'point_coords': [[394.859375, 264.0]],
  'stability_score': 0.97826087474823,
  'crop_box': [0, 0, 683, 512]},
 {'segmentation': array([[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]),
  'area': 372,
  'bbox': [190, 325, 18, 21],
  'predicted_iou': 0.8836345076560974,
  'point_coords': [[202.765625, 328.0]],
  'stability_score': 0.9683377146720886,
  'crop_box': [0, 0, 683, 512]}]

可视化分割图像 + 预测框¶

In [ ]:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

def show_ann(anns):
    if len(anns) == 0:
        return
    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse = True)
    ax = plt.gca()
    ax.set_autoscale_on(False)

    img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))
    img[:,:,3] = 0
    for ann in sorted_anns:
        m = ann['segmentation']
        color_mask = np.concatenate([np.random.random(3), [0.35]])
        img[m] = color_mask
        # 绘制边界框
        x, y, w, h = ann['bbox']
        rect = patches.Rectangle((x, y), w, h, linewidth = 1, edgecolor = 'r', facecolor = 'none')
        ax.add_patch(rect)
    ax.imshow(img)
In [ ]:
plt.figure(figsize=(20, 20))
plt.imshow(image)
show_ann(masks)
plt.axis('off')
plt.show()

SAM生成的框的提取¶

In [ ]:
def extract_bboxes(anns):
    if len(anns) == 0:
        return []

    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse = True)
    bbox_list = []

    for ann in sorted_anns:
        x, y, w, h = ann['bbox']
        bbox_list.append((x, y, x + w, y + h))

    return bbox_list
In [ ]:
bbox_list = extract_bboxes(masks)
bbox_list
Out[ ]:
[(0, 369, 682, 510),
 (0, 0, 627, 158),
 (0, 0, 624, 111),
 (534, 22, 676, 453),
 (535, 155, 676, 453),
 (0, 366, 404, 510),
 (227, 287, 526, 509),
 (278, 319, 519, 509),
 (537, 155, 675, 351),
 (596, 156, 675, 351),
 (436, 411, 682, 510),
 (535, 337, 671, 451),
 (255, 126, 373, 286),
 (236, 297, 382, 510),
 (536, 163, 596, 340),
 (416, 52, 530, 175),
 (332, 165, 533, 397),
 (181, 99, 254, 287),
 (4, 78, 67, 230),
 (332, 166, 533, 286),
 (603, 20, 678, 147),
 (433, 337, 506, 482),
 (65, 87, 161, 194),
 (6, 280, 158, 386),
 (417, 53, 505, 161),
 (342, 109, 421, 227),
 (74, 270, 164, 375),
 (6, 282, 85, 386),
 (197, 288, 271, 475),
 (254, 162, 313, 286),
 (46, 194, 180, 278),
 (225, 286, 527, 333),
 (327, 274, 533, 407),
 (613, 29, 668, 139),
 (86, 291, 162, 375),
 (143, 98, 196, 229),
 (312, 160, 374, 285),
 (542, 43, 593, 148),
 (151, 279, 209, 445),
 (25, 285, 82, 373),
 (87, 291, 162, 350),
 (458, 72, 501, 156),
 (507, 83, 535, 226),
 (144, 143, 195, 229),
 (28, 306, 81, 372),
 (65, 164, 161, 194),
 (421, 80, 457, 161),
 (546, 227, 581, 282),
 (278, 356, 369, 387),
 (88, 344, 162, 375),
 (400, 0, 425, 162),
 (155, 99, 196, 143),
 (308, 12, 331, 173),
 (423, 168, 449, 227),
 (103, 301, 151, 335),
 (465, 189, 508, 247),
 (73, 270, 163, 292),
 (75, 211, 126, 261),
 (581, 195, 594, 307),
 (598, 194, 610, 309),
 (314, 356, 368, 386),
 (241, 41, 260, 180),
 (546, 247, 580, 282),
 (25, 286, 79, 308),
 (400, 87, 425, 143),
 (215, 338, 269, 364),
 (471, 194, 507, 238),
 (219, 175, 247, 257),
 (82, 216, 119, 253),
 (505, 51, 532, 85),
 (276, 261, 331, 300),
 (308, 110, 331, 156),
 (219, 175, 247, 222),
 (219, 175, 247, 207),
 (355, 281, 404, 298),
 (167, 325, 208, 346),
 (167, 272, 209, 290),
 (444, 290, 487, 305),
 (241, 127, 260, 167),
 (405, 286, 444, 303),
 (281, 282, 332, 300),
 (24, 101, 50, 123),
 (286, 286, 331, 299),
 (166, 117, 189, 137),
 (33, 370, 79, 384),
 (190, 325, 208, 346),
 (463, 252, 487, 283),
 (331, 278, 354, 293),
 (531, 0, 559, 12),
 (212, 498, 239, 511),
 (433, 247, 448, 260),
 (243, 165, 257, 181),
 (225, 246, 239, 258),
 (386, 45, 407, 54),
 (519, 396, 531, 410),
 (14, 272, 33, 280),
 (145, 72, 165, 79),
 (393, 264, 404, 276),
 (392, 245, 399, 258),
 (408, 246, 416, 259),
 (640, 169, 655, 175),
 (409, 247, 415, 259),
 (303, 183, 309, 193),
 (324, 263, 331, 269),
 (263, 265, 270, 271),
 (353, 102, 358, 109)]

SAM生成的框的可视化¶

In [ ]:
from PIL import Image, ImageDraw

def draw_bboxes(image, bboxes, color="red", thickness=2):
    draw = ImageDraw.Draw(image)
    for bbox in bboxes:
        bbox = tuple(map(int, bbox))  # 将浮点数类型的坐标转换为整数类型
        draw.rectangle(bbox, outline=color, width=thickness)
    del draw

image_path = "demo.jpg"
image = Image.open(image_path).convert("RGB")
draw_bboxes(image, bbox_list)
image.show()

GT框的测试¶

In [ ]:
from PIL import Image, ImageDraw

def draw_bboxes(image, bboxes, color = "red", thickness = 2):
    draw = ImageDraw.Draw(image)
    for bbox in bboxes:
        bbox = tuple(map(int, bbox))  # 将浮点数类型的坐标转换为整数类型
        draw.rectangle(bbox, outline=color, width=thickness)
    del draw

# 示例用法
image_path = "demo.jpg"
bboxes = [
    (236, 41, 263, 180), (218, 174, 248, 207), (306, 10, 332, 175), (396, 0, 426, 162),
    (189, 281, 528, 512), (255, 293, 388, 512), (193, 285, 302, 476),
    (146, 280, 213, 445), (339, 113, 450, 229), (406, 49, 508, 177), (499, 82, 537, 229),
    (521, 0, 683, 167), (5, 281, 88, 389), (162, 275, 212, 366), (10, 79, 67, 235),
    (142, 97, 196, 234), (325, 275, 533, 411), (65, 82, 154, 165), (462, 251, 488, 285),
    (422, 277, 502, 286), (501, 254, 512, 290), (511, 255, 521, 288), (532, 151, 676, 451),
    (61, 171, 163, 198), (64, 268, 166, 291), (83, 291, 166, 377), (502, 254, 520, 283),
    (11, 250, 32, 273), (12, 272, 34, 282), (288, 284, 332, 301)
]

image = Image.open(image_path).convert("RGB")
draw_bboxes(image, bboxes)

image.show()

GT框和SAM预测框的结果可视化¶

In [ ]:
def draw_bboxes(image, bboxes, color = "red", thickness = 2):
    draw = ImageDraw.Draw(image)
    for bbox in bboxes:
        bbox = tuple(map(int, bbox))  # 将浮点数类型的坐标转换为整数类型
        draw.rectangle(bbox, outline=color, width=thickness)
    del draw

def draw_bboxes_2(image, bboxes, color = "blue", thickness = 1):
    draw = ImageDraw.Draw(image)
    for bbox in bboxes:
        bbox = tuple(map(int, bbox))  # 将浮点数类型的坐标转换为整数类型
        draw.rectangle(bbox, outline=color, width=thickness)
    del draw

# 示例用法
image_path = "demo.jpg"
bboxes = [
    (236, 41, 263, 180), (218, 174, 248, 207), (306, 10, 332, 175), (396, 0, 426, 162),
    (189, 281, 528, 512), (255, 293, 388, 512), (193, 285, 302, 476),
    (146, 280, 213, 445), (339, 113, 450, 229), (406, 49, 508, 177), (499, 82, 537, 229),
    (521, 0, 683, 167), (5, 281, 88, 389), (162, 275, 212, 366), (10, 79, 67, 235),
    (142, 97, 196, 234), (325, 275, 533, 411), (65, 82, 154, 165), (462, 251, 488, 285),
    (422, 277, 502, 286), (501, 254, 512, 290), (511, 255, 521, 288), (532, 151, 676, 451),
    (61, 171, 163, 198), (64, 268, 166, 291), (83, 291, 166, 377), (502, 254, 520, 283),
    (11, 250, 32, 273), (12, 272, 34, 282), (288, 284, 332, 301)
]

image = Image.open(image_path).convert("RGB")
draw_bboxes(image, bboxes)
draw_bboxes_2(image, bbox_list)

image.show()

根据IoU值来进行¶

In [ ]:
def calculate_iou(bbox1, bbox2):
    x1_min, y1_min, x1_max, y1_max = bbox1
    x2_min, y2_min, x2_max, y2_max = bbox2

    # 计算两个边界框的相交部分
    x_min = max(x1_min, x2_min)
    y_min = max(y1_min, y2_min)
    x_max = min(x1_max, x2_max)
    y_max = min(y1_max, y2_max)

    intersection = max(0, x_max - x_min) * max(0, y_max - y_min)

    # 计算两个边界框的面积
    area1 = (x1_max - x1_min) * (y1_max - y1_min)
    area2 = (x2_max - x2_min) * (y2_max - y2_min)

    # 计算 IoU
    iou = intersection / (area1 + area2 - intersection)

    return iou

bboxes = [
    (236, 41, 263, 180), (218, 174, 248, 207), (306, 10, 332, 175), (396, 0, 426, 162),
    (189, 281, 528, 512), (255, 293, 388, 512), (193, 285, 302, 476),
    (146, 280, 213, 445), (339, 113, 450, 229), (406, 49, 508, 177), (499, 82, 537, 229),
    (521, 0, 683, 167), (5, 281, 88, 389), (162, 275, 212, 366), (10, 79, 67, 235),
    (142, 97, 196, 234), (325, 275, 533, 411), (65, 82, 154, 165), (462, 251, 488, 285),
    (422, 277, 502, 286), (501, 254, 512, 290), (511, 255, 521, 288), (532, 151, 676, 451),
    (61, 171, 163, 198), (64, 268, 166, 291), (83, 291, 166, 377), (502, 254, 520, 283),
    (11, 250, 32, 273), (12, 272, 34, 282), (288, 284, 332, 301)
]

selected_bboxes = []
for pred_bbox in bbox_list:
    for gt_bbox in bboxes:
        iou_scores = [calculate_iou(pred_bbox, gt_bbox) for gt_bbox in bboxes]
        max_iou = max(iou_scores)
        if max_iou > 0.4:
            selected_bboxes.append(pred_bbox)

print(selected_bboxes)
[(534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (534, 22, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (535, 155, 676, 453), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (227, 287, 526, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (278, 319, 519, 509), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (537, 155, 675, 351), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (236, 297, 382, 510), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (416, 52, 530, 175), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (332, 165, 533, 397), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (4, 78, 67, 230), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (65, 87, 161, 194), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (6, 280, 158, 386), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (417, 53, 505, 161), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (342, 109, 421, 227), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (74, 270, 164, 375), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (6, 282, 85, 386), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (197, 288, 271, 475), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (327, 274, 533, 407), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (86, 291, 162, 375), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (143, 98, 196, 229), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (151, 279, 209, 445), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (25, 285, 82, 373), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (87, 291, 162, 350), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (507, 83, 535, 226), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (144, 143, 195, 229), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (65, 164, 161, 194), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (400, 0, 425, 162), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (308, 12, 331, 173), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (73, 270, 163, 292), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (241, 41, 260, 180), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 222), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (219, 175, 247, 207), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (281, 282, 332, 300), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (286, 286, 331, 299), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (463, 252, 487, 283), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280), (14, 272, 33, 280)]
In [ ]:
def draw_bboxes(image, bboxes, color = "red", thickness = 2):
    draw = ImageDraw.Draw(image)
    for bbox in bboxes:
        bbox = tuple(map(int, bbox))  # 将浮点数类型的坐标转换为整数类型
        draw.rectangle(bbox, outline=color, width=thickness)
    del draw

def draw_bboxes_2(image, bboxes, color = "blue", thickness = 1):
    draw = ImageDraw.Draw(image)
    for bbox in bboxes:
        bbox = tuple(map(int, bbox))  # 将浮点数类型的坐标转换为整数类型
        draw.rectangle(bbox, outline=color, width=thickness)
    del draw

# 示例用法
image_path = "demo.jpg"
bboxes = [
    (236, 41, 263, 180), (218, 174, 248, 207), (306, 10, 332, 175), (396, 0, 426, 162),
    (189, 281, 528, 512), (255, 293, 388, 512), (193, 285, 302, 476),
    (146, 280, 213, 445), (339, 113, 450, 229), (406, 49, 508, 177), (499, 82, 537, 229),
    (521, 0, 683, 167), (5, 281, 88, 389), (162, 275, 212, 366), (10, 79, 67, 235),
    (142, 97, 196, 234), (325, 275, 533, 411), (65, 82, 154, 165), (462, 251, 488, 285),
    (422, 277, 502, 286), (501, 254, 512, 290), (511, 255, 521, 288), (532, 151, 676, 451),
    (61, 171, 163, 198), (64, 268, 166, 291), (83, 291, 166, 377), (502, 254, 520, 283),
    (11, 250, 32, 273), (12, 272, 34, 282), (288, 284, 332, 301)
]

image = Image.open(image_path).convert("RGB")
draw_bboxes(image, bboxes)
draw_bboxes_2(image, selected_bboxes)

image.show()